import QtQuick 2.7

import Common 1.0
import Utils 1.0

// =============================================================================

Item {
	id: menu
	
	// ---------------------------------------------------------------------------
	
	property alias relativeTo: popup.relativeTo
	property alias relativeX: popup.relativeX
	property alias relativeY: popup.relativeY
	
	// Can be computed, but for performance usage, it must be given in attribute.
	property int entryHeight
	property int maxMenuHeight
	
	default property alias _content: menuContent.data
	property alias closePolicy : popup.closePolicy
	
	// ---------------------------------------------------------------------------
	
	signal closed
	signal opened
	
	// ---------------------------------------------------------------------------
	
	function open () {
		popup.open()
	}
	
	function close () {
		popup.close()
	}
	
	// ---------------------------------------------------------------------------
	
	function _computeHeight () {
		Utils.assert(_content != null && _content.length > 0, '`_content` cannot be null and must exists.')
		
		var list = _content[0]
		Utils.assert(list != null, 'No list found.')
		
		var height = list.count * entryHeight
		
		if (list.headerPositioning === ListView.OverlayHeader) {
			// Workaround to force header layout.
			list.headerItem.z = Constants.zMax
			
			height += list.headerItem.height
		}
		
		return  (maxMenuHeight !== undefined && maxMenuHeight != 0 && height > maxMenuHeight)
				? maxMenuHeight
				: height
	}
	
	// ---------------------------------------------------------------------------
	
	visible: false
	
	// ---------------------------------------------------------------------------
	
	Popup {
		id: popup    
		
		onOpened: menu.opened()
		onClosed: menu.closed()
		height: menu._computeHeight()
		width: menu._content[0].width
		
		Item {
			id: menuContent
			anchors.fill: parent
			
		}
	}
	
	Binding {
		property: 'height'
		target: menu._content[0]
		value: menuContent.height
	}
}
